home *** CD-ROM | disk | FTP | other *** search
/ Clickx 115 / Clickx 115.iso / software / tools / windows / tails-i386-0.16.iso / live / filesystem.squashfs / var / lib / dpkg / info / udev.preinst < prev    next >
Encoding:
Text File  |  2010-12-12  |  7.2 KB  |  298 lines

  1. #!/bin/sh -e
  2.  
  3. # Hack to get the dpkg process' PID despite using debconf
  4. if [ -z "$PARENT_PID" ]; then
  5.   export PARENT_PID=$PPID
  6. fi
  7.  
  8. . /usr/share/debconf/confmodule
  9.  
  10. supported_kernel() {
  11.   local version
  12.   if [ "$1" ]; then
  13.     version="$1"
  14.   else
  15.     version="$(uname -r)"
  16.   fi
  17.  
  18.   case "$version" in
  19.     2.[012345].*|2.6.[0-9]|2.6.[0-9][!0-9]*) return 1 ;;
  20.     2.6.1[0-9]|2.6.1[0-9][!0-9]*) return 1 ;;
  21.     2.6.2[0-5]|2.6.2[0-5][!0-9]*) return 1 ;;
  22.   esac
  23.   return 0
  24. }
  25.  
  26. check_installed_kernel() {
  27.   for ver in /lib/modules/*; do
  28.     ver=${ver##*/}
  29.     [ "$ver" = '*' ] && return 1
  30.     supported_kernel "$ver" && return 0
  31.   done
  32.   return 1
  33. }
  34.  
  35. check_installing_kernel() {
  36.   for pkg in $(ps hp $PARENT_PID -o args); do
  37.     ver=$(echo $pkg | sed -nr "s/^.*linux-image-(2\.6\.[0-9]+)-([0-9]+|trunk)-.*_.*_.*\.deb$/\1/p")
  38.     [ "$ver" ] && supported_kernel "$ver" && return 0
  39.   done
  40.   return 1
  41. }
  42.  
  43. check_kernel_version() {
  44.   # skip the check if udev is not already active
  45.   [ -d /dev/.udev/ ] || return 0
  46.  
  47.   supported_kernel && return
  48.  
  49.   if [ -e /etc/udev/kernel-upgrade ]; then
  50.     echo "This version of udev requires a kernel >= 2.6.26, but the upgrade was forced."
  51.     # restart udevd which was killed by the old prerm
  52.     udevd -d || true
  53.     return 0
  54.   fi
  55.   
  56.   db_settitle udev/title/upgrade
  57.  
  58.   if check_installed_kernel || check_installing_kernel; then
  59.     db_fset udev/reboot_needed seen false
  60.     db_input high udev/reboot_needed || true
  61.     db_go
  62.     db_stop
  63.     echo "A reboot is needed, but proceeding with the upgrade."
  64.     touch /etc/udev/kernel-upgrade
  65.     # restart udevd which was killed by the old prerm
  66.     udevd -d || true
  67.     return 0
  68.   fi
  69.  
  70.   db_fset udev/new_kernel_needed seen false
  71.   db_reset udev/new_kernel_needed
  72.   db_input critical udev/new_kernel_needed || true
  73.   db_go
  74.   db_get udev/new_kernel_needed
  75.   if [ "$RET" = true ]; then
  76.     db_stop
  77.     echo "This version of udev requires a kernel >= 2.6.26, but the upgrade was forced."
  78.     touch /etc/udev/kernel-upgrade
  79.     # restart udevd which was killed by the old prerm
  80.     udevd -d || true
  81.     return 0
  82.   fi
  83.   db_stop
  84.   exit 1
  85. }
  86.  
  87. check_kernel_features() {
  88.   # skip the check if udev is not already active
  89.   [ -d /dev/.udev/ ] || return 0
  90.  
  91.   # skip the check if check_kernel_version() decided that a new kernel is
  92.   # being installed
  93.   [ -e /etc/udev/kernel-upgrade ] && return 0
  94.  
  95.   local abort_install=0
  96.  
  97.   if [ -e /proc/kallsyms ]; then
  98.  
  99.   local needed_symbols='sys_inotify_init sys_signalfd'
  100.   local missing_symbol=0
  101.   for symbol in $needed_symbols; do
  102.     if ! egrep -q "^[a-fA-F0-9]+ T \.?${symbol}$" /proc/kallsyms; then
  103.       missing_symbol=1
  104.       abort_install=1
  105.       break
  106.     fi
  107.   done
  108.  
  109.   fi
  110.  
  111.   local sysfs_deprecated=0
  112.   if [ -d /sys/class/mem/null -a ! -L /sys/class/mem/null ]; then
  113.     sysfs_deprecated=1
  114.   fi
  115.  
  116.   if [ "$missing_symbol" -eq 1 ]; then
  117.     cat <<END
  118. Since release 146, udev requires support for the following features in
  119. the running kernel:
  120.  
  121. - inotify(2)       (CONFIG_INOTIFY_USER)
  122. - signalfd(2)      (CONFIG_SIGNALFD)
  123. END
  124.   fi
  125.  
  126.   if [ "$sysfs_deprecated" -eq 1 ]; then
  127.     db_input critical udev/sysfs_deprecated_incompatibility || true
  128.   fi
  129.  
  130.   if [ "$abort_install" -eq 0 ]; then
  131.     return 0
  132.   fi
  133.  
  134.   cat <<END
  135.  
  136. Please upgrade your kernel before or while upgrading udev.
  137.  
  138. AT YOUR OWN RISK, you can force the installation of this version of udev
  139. WHICH DOES NOT WORK WITH YOUR RUNNING KERNEL AND WILL BREAK YOUR SYSTEM
  140. AT THE NEXT REBOOT by creating the /etc/udev/kernel-upgrade file.
  141. There is always a safer way to upgrade, do not try this unless you
  142. understand what you are doing!
  143.  
  144.  
  145. END
  146.  
  147.   db_stop
  148.   exit 1
  149. }
  150.  
  151. check_devfs_names() {
  152.   [ -e /etc/udev/rules.d/devfs.rules ] || return 0
  153.  
  154.   cat <<END
  155. Since release 0.124-1 udev does not support anymore devfs-like names.
  156. Please convert to standard names before upgrading:
  157.  
  158. rm -f /etc/udev/rules.d/devfs.rules /etc/udev/rules.d/compat-full.rules /etc/udev/rules.d/compat.rules
  159. ln -s ../udev.rules /etc/udev/rules.d/
  160.  
  161. END
  162.   exit 1
  163. }
  164.  
  165. rm_conffile() {
  166.   mv_conffile "$1" "$1.dpkg-bak"
  167. }
  168.  
  169. mv_conffile() {
  170.   local package='udev'
  171.   local name="$1"
  172.   local newname="$2"
  173.  
  174.   [ -e "$name" ] || return 0
  175.  
  176.   local md5="$(md5sum $name | sed -e 's/ .*//')"
  177.   oldmd5="$(dpkg-query -W -f='${Conffiles}' $package | \
  178.     sed -n -e "\' $name ' { s/ obsolete$//; s/.* //; p }")"
  179.  
  180.   if [ "$md5" = "$oldmd5" ]; then
  181.     rm -f "$name"
  182.   else
  183.     mv "$name" "$newname"
  184.   fi
  185. }
  186.  
  187. replace_sysfs_attr() {
  188.   local file=$1
  189.   [ -f $file ] || return 0
  190.   egrep '^[^#].+\<SYSFS\{' $file || return 0
  191.  
  192.   sed -r -e '/^#/!s/\<SYSFS(\{[^}]+}==)/ATTR\1/g' < $file > $file.tmp
  193.   mv $file.tmp $file
  194. }
  195.  
  196. check_version() {
  197.   # $2 is non-empty when installing from the "config-files" state
  198.   [ "$2" ] || return 0
  199.  
  200.   if dpkg --compare-versions $2 lt 157-1; then
  201.  
  202.   if dpkg --compare-versions $2 lt 150-1; then
  203.  
  204.   # these must be checked first to allow aborting before changing anything
  205.   check_kernel_version
  206.   check_kernel_features
  207.  
  208.   if dpkg --compare-versions $2 lt 0.140-1; then
  209.   if dpkg --compare-versions $2 lt 0.124-1; then
  210.  
  211.   # this must be checked first to allow aborting before changing anything
  212.   check_devfs_names
  213.  
  214.   if dpkg --compare-versions $2 lt 0.098-1; then
  215.     echo 'Upgrading udev from packages older than 0.098-1 is not supported.'
  216.     echo 'Please purge the package and then reinstall it.'
  217.     exit 1
  218.   fi
  219.  
  220.   # lt 0.124-1
  221.   rm_conffile /etc/udev/cd-aliases-generator.rules
  222.   rm_conffile /etc/udev/compat-full.rules
  223.   rm_conffile /etc/udev/compat.rules
  224.   rm_conffile /etc/udev/devfs.rules
  225.   rm_conffile /etc/udev/hotplug.rules
  226.   rm_conffile /etc/udev/permissions.rules
  227.   rm_conffile /etc/udev/persistent-input.rules
  228.   rm_conffile /etc/udev/persistent-net-generator.rules
  229.   rm_conffile /etc/udev/persistent.rules
  230.   rm_conffile /etc/udev/run.rules
  231.   rm_conffile /etc/udev/udev.rules
  232.   # removed in 0.113-1
  233.   rm_conffile /etc/udev/hotplugd.rules
  234.  
  235.   (
  236.   cd /etc/udev/rules.d/
  237.  
  238.   # delete dangling symlinks
  239.   find -L . -type l -print0 | xargs --no-run-if-empty --null rm
  240.  
  241.   # rename the generated files
  242.   if [ -e z25_persistent-cd.rules  -a ! -e 70-persistent-cd.rules  ]; then
  243.     mv z25_persistent-cd.rules  70-persistent-cd.rules
  244.   fi
  245.   if [ -e z25_persistent-net.rules -a ! -e 70-persistent-net.rules ]; then
  246.     mv z25_persistent-net.rules 70-persistent-net.rules
  247.   fi
  248.   )
  249.  
  250.   fi # 0.124-1
  251.  
  252.   # lt 0.140-1
  253.   rm_conffile /etc/modprobe.d/display_class
  254.   rm_conffile /etc/modprobe.d/pnp-hotplug
  255.   mv_conffile /etc/modprobe.d/blacklist /etc/modprobe.d/blacklist.conf
  256.  
  257.   for file in 50-udev 60-persistent-input 60-persistent-storage \
  258.       60-persistent-storage-tape 60-persistent-v4l 91-permissions 80-drivers \
  259.       75-cd-aliases-generator 75-persistent-net-generator 95-late; do
  260.     rm_conffile /etc/udev/rules.d/$file.rules
  261.   done
  262.  
  263.   # SYSFS is equivalent to ATTRS, and multiple ATTRS attributes do not match
  264.   # when the keys are from different kobjects like in this case.
  265.   replace_sysfs_attr /etc/udev/rules.d/70-persistent-net.rules
  266.  
  267.   fi # 0.140-1
  268.  
  269.   # lt 146-1
  270.   rm_conffile /etc/scsi_id.config
  271.  
  272.   fi # 146-1
  273.  
  274.   # suppress errors when the new rules files contain options not supported by
  275.   # the old daemon
  276.   udevadm control --log-priority=0 || true
  277.  
  278.   fi # 157-1
  279. }
  280.  
  281. case "$1" in
  282.     install)
  283.     check_version "$@"
  284.     ;;
  285.  
  286.     upgrade|abort-upgrade)
  287.     check_version "$@"
  288.     ;;
  289.  
  290.     *)
  291.     echo "$0 called with unknown argument '$1'" >&2
  292.     exit 1
  293.     ;;
  294. esac
  295.  
  296.  
  297.  
  298.